#pragma once

#include "rend_Color.h"
#include "rend_Font.h"
#include "rend_Quad.h"
#include "rend_ParticleSystem.h"
#include "rend_Sprite.h"
#include "rend_RenderTarget.h"
#include "rend_Texture.h"

enum TEXTURE_FILTER
{
	TF_NONE,
	TF_POINT,
	TF_LINEAR,
	TF_COUNT
};

//! Glowna klasa renderera. Robi wszystko oprocz herbaty.

class Renderer
{
public:
	//! Nic nie robi.
	virtual					~Renderer(){}
	//! Usuwa zasoby i przywraca domyslne ustawienia ekranu.
	virtual void			drop() = 0;
	//! Pobiera zdarzenie okna.
	virtual bool			get_event(Event &event) = 0;
	//! Czysci ekran, ustawia RenderTarget.
	virtual bool			begin_scene(const Color &background = 0, const RenderTarget& rt = -1) = 0;
	//! Rysuje BackBuffer na ekranie.
	virtual bool			end_scene() = 0;
	//! Ustawia projekcje.
	//! @param width - szerokosc ekranu
	//! @param height - wysokosc ekranu
	virtual void			set_projection(float width, float height) = 0;
	//! Ustawia kamere.
	virtual void			look_at(float x, float y, float rot=0.0f) = 0;
	//! Ustawia obszar do ktorego mozna renderowac.
	virtual void			scissor(int x, int y, int width, int height) = 0;
	//! Ustawia filtrowanie tekstur.
	virtual void			set_texture_filter(u32 filter) = 0;
	//! Wczytuje teksture.
	virtual Texture			get_texture(const wchar_t* filename) = 0;
	//! Zwraca szerokosc i wysokosc tekstury w pikselach.
	virtual void			get_texture_size(const Texture &texture, int &width, int &height) = 0;
	//! Usuwa teksture.
	virtual void			remove_texture(const Texture &id) = 0;
	//! Tworzy render target.
	virtual RenderTarget	create_render_target(int width, int height) = 0;
	//! Zwraca teksture render targetu.
	virtual Texture			get_render_target_texture(RenderTarget render_target) = 0;
	//! Glowna funkcja rysujaca, rysuje quad.
	virtual void			render_quad(const Quad &quad) = 0;
	//! Tworzy system czasteczek na podstawie opisu.
	virtual ParticleSystem*	create_particle_system(const ParticleSystemDesc &desc) = 0;
	//! Wczytuje czcionke z pliku.
	virtual FontPtr			create_font(const wchar_t *filename) = 0;
	//! Tworzy sprajt.
	virtual SpritePtr		create_sprite(const Texture &texture) = 0;

	//! Pokazac kursor?
	virtual void			show_cursor(bool show) = 0;
	//! Ustawia tytul okna.
	virtual void			set_window_caption(const wchar_t* name) = 0;
};

//! Tworzy okno i binduje do niego renderer.
Renderer* create_engine(unsigned int width, unsigned int height, bool fullscreen, const wchar_t *caption, bool antialiasing);
//! Tworzy renderer i binduje go do konkretnego okna.
Renderer* create_engine_ex(bool antialiasing, void* hwnd);
